#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>

//单个进程程序替换
//int main()
//{
//    printf("before:I am a process, pid:%d, ppid:%d\n", getpid(), getppid());
//    
//    //进程替换的标准写法
//    execl("/usr/bin/ls", "ls", "-a", "-l", NULL);
//
//    printf("after:I am a process, pid:%d, ppid:%d\n", getpid(), getppid());
//    return 0;
//}

//多个进程，子进程进程替换
//int main()
//{
//    pid_t id  = fork();
//    if(id == 0)
//    {
//        printf("before:I am a process, pid:%d, ppid:%d\n", getpid(), getppid());
//
//        //execl("/usr/bin/ls", "ls", "-a", "-l", NULL);
//        execlp("ls", "ls", "-a", "-l", NULL);
//        printf("after:I am a process, pid:%d, ppid:%d\n", getpid(), getppid());
//        exit(0);
//    }
//    //father
//    pid_t ret = waitpid(id, NULL, 0);
//    if(ret > 0)
//    {
//        printf("wait sunccess,father pid:%d, ret id:%d\n", getpid(), ret);
//    }
//    return 0;
//}


//int main()
//{
//    pid_t id  = fork();
//    if(id == 0)
//    {
//        char* const myargv[]={"ls", "-l", "-a", NULL};
//       // const char* myargv[]={
//       //  "ls",
//       //  "-a",
//       //  "-l",
//       // };
//        printf("before:I am a process, pid:%d, ppid:%d\n", getpid(), getppid());
//
//        //execv("/usr/bin/ls", myargv);
//        execvp("ls", myargv);
//
//        printf("after:I am a process, pid:%d, ppid:%d\n", getpid(), getppid());
//        exit(0);
//    }
//    //father
//    pid_t ret = waitpid(id, NULL, 0);
//    if(ret > 0)
//    {
//        printf("wait sunccess,father pid:%d, ret id:%d\n", getpid(), ret);
//    }
//    return 0;
//}

//用excel函数替换成自己写的程序
//这个调用可以跨语言比如python java shell 因为所有语言运行过后本质都是进程
//int main()
//{
//    pid_t id  = fork();
//    if(id == 0)
//    {
//        char* const myargv[]={"ls", "-l", "-a", NULL};
//        printf("before:I am a process, pid:%d, ppid:%d\n", getpid(), getppid());
//
//        execl("./otherExe", "otherExe", NULL);
//
//        printf("after:I am a process, pid:%d, ppid:%d\n", getpid(), getppid());
//        exit(1);
//    }
//    //father
//    pid_t ret = waitpid(id, NULL, 0);
//    if(ret > 0)
//    {
//        printf("wait sunccess,father pid:%d, ret id:%d\n", getpid(), ret);
//    }
//    return 0;
//}


//int main()
//{
//    pid_t id  = fork();
//    if(id == 0)
//    {
//        char* const myargv[]={"otherExe", "-a", "-l", NULL};
//        printf("before:I am a process, pid:%d, ppid:%d\n", getpid(), getppid());
//
//        execv("./otherExe", myargv);
//
//        printf("after:I am a process, pid:%d, ppid:%d\n", getpid(), getppid());
//        exit(1);
//    }
//    //father
//    pid_t ret = waitpid(id, NULL, 0);
//    if(ret > 0)
//    {
//        printf("wait sunccess,father pid:%d, ret id:%d\n", getpid(), ret);
//    }
//    return 0;
//}

//自动传递环境变量给进程替换程序
//int main()
//{
//    //添加环境变量
//    putenv("PROVATE_ENV=66666");
//    pid_t id  = fork();
//    if(id == 0)
//    {
//        char* const myargv[]={"otherExe", "-a", "-l", NULL};
//        printf("before:I am a process, pid:%d, ppid:%d\n", getpid(), getppid());
//
//        execv("./otherExe", myargv);
//
//        printf("after:I am a process, pid:%d, ppid:%d\n", getpid(), getppid());
//        exit(1);
//    }
//    //father
//    pid_t ret = waitpid(id, NULL, 0);
//    if(ret > 0)
//    {
//        printf("wait sunccess,father pid:%d, ret id:%d\n", getpid(), ret);
//    }
//    return 0;
//}


int main()
{
    //彻底替换环境变量
    extern char** environ;
    putenv("PROVATE_ENV=66666");
    pid_t id  = fork();
    if(id == 0)
    {
        char* const myargv[]={"otherExe", "-a", "-l", NULL};
        printf("before:I am a process, pid:%d, ppid:%d\n", getpid(), getppid());
        
        //传递系统的环境变量
        //execle("./otherExe", "otherExe", "-a", "-l", NULL, environ);
        
        //传递自己的环境变量
        char* const myenv[]={"MYVALUE=123", "MYPATH=user/bin/bbbb", NULL};
        execle("./otherExe", "otherExe", "-a", "-l", NULL, myenv);

        printf("after:I am a process, pid:%d, ppid:%d\n", getpid(), getppid());
        exit(1);
    }
    //father
    pid_t ret = waitpid(id, NULL, 0);
    if(ret > 0)
    {
        printf("wait sunccess,father pid:%d, ret id:%d\n", getpid(), ret);
    }
    return 0;
}
